/*#########################################
# Copyright (c) [2010-2011], Josef Robert Novak
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#  modification, are permitted #provided that the following conditions
#  are met:
#
# * Redistributions of source code must retain the above copyright 
#    notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above 
#    copyright notice, this list of #conditions and the following 
#    disclaimer in the documentation and/or other materials provided 
#    with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
# OF THE POSSIBILITY OF SUCH DAMAGE.
#############################*/

#include "SymbolTable.h"

SymbolTable::SymbolTable( ) {
  eps    = "<eps>";
  n_syms = 0;
  AddSymbol( eps );
}

SymbolTable::SymbolTable( const char* eps ) {
  eps    = eps;
  n_syms = 0;
  AddSymbol( eps );
}

int SymbolTable::AddSymbol( const char* sym ){
    SymbolMap::iterator it = smap.find(sym);
    if( it != smap.end() )
        return it->second;

    smap.insert(SymbolMap::value_type(sym, n_syms));
    imap.insert(IndexMap::value_type(n_syms, sym));
    n_syms++;
    return n_syms-1;
}

int SymbolTable::AddSymbol( string sym ){
    SymbolMap::iterator it = smap.find(sym);
    if( it != smap.end() )
        return it->second;

    smap.insert(SymbolMap::value_type(sym, n_syms));
    imap.insert(IndexMap::value_type(n_syms, sym));
    n_syms++;
    return n_syms-1;
}

int SymbolTable::GetSymbol( const char* sym ){
    SymbolMap::iterator it = smap.find(sym);
    if( it != smap.end() )
        return it->second;
    return -1;
}

void SymbolTable::WriteTable( const char* ofile ) {
    ofstream smap_ofp(ofile);
    IndexMap::iterator it;
    for( int i=0; i<n_syms; i++ ){
        it = imap.find(i);
        smap_ofp << it->second << " " << it->first << endl;
    }
    smap_ofp.close();
}

int SymbolTable::get_num_symbols( ){
    return n_syms;
}

